using DesktopWidgetApp.Server.Models;
using Microsoft.EntityFrameworkCore;
using System;
using System.Linq;
using System.Threading.Tasks;

namespace DesktopWidgetApp.Server.Services
{
    /// <summary>
    /// 种子数据服务
    /// 用于初始化系统所需的基础数据
    /// </summary>
    public class SeedDataService
    {
        private readonly AppDbContext _dbContext;
        private readonly IUserService _userService;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="dbContext">数据库上下文</param>
        /// <param name="userService">用户服务</param>
        public SeedDataService(AppDbContext dbContext, IUserService userService)
        {
            _dbContext = dbContext;
            _userService = userService;
        }

        /// <summary>
        /// 初始化种子数据
        /// </summary>
        /// <returns>初始化结果</returns>
        public async Task InitializeAsync()
        {
            try
            {
                // 确保数据库已创建
                await _dbContext.Database.EnsureCreatedAsync();

                // 检查是否已经初始化过数据
                // 使用简单查询避免复杂EF Core操作
                bool hasUsers = false;
                try
                {
                    hasUsers = await _dbContext.Users.AnyAsync();
                }
                catch (Exception ex)
                {
                    Console.WriteLine("检查用户数据时发生错误: " + ex.Message);
                }

                if (hasUsers)
                {
                    return; // 数据库已包含数据，不需要再次初始化
                }

                // 创建默认超级管理员用户
                await CreateDefaultAdminUserAsync();
            }
            catch (Exception ex)
            {
                Console.WriteLine("初始化种子数据时发生错误: " + ex.Message);
                // 在开发环境中输出完整异常信息
#if DEBUG
                Console.WriteLine(ex.StackTrace);
#endif
            }
        }

        /// <summary>
        /// 创建默认超级管理员用户
        /// </summary>
        private async Task CreateDefaultAdminUserAsync()
        {
            // 生成密码盐和哈希
            string username = "admin";
            string email = "admin@example.com";
            string password = "Admin@123";

            // 调用用户服务创建超级管理员用户
            var (success, message, user) = await _userService.RegisterUserAsync(username, email, password);

            if (success && user != null)
            {
                // 将用户角色更新为超级管理员
                user.Role = Role.SuperAdmin.ToString();
                await _userService.UpdateUserAsync(user);
                
                Console.WriteLine("默认超级管理员用户已创建：\n用户名: admin\n密码: Admin@123\n请在生产环境中立即更改密码！");
            }
            else
            {
                Console.WriteLine("创建默认超级管理员用户失败: " + message);
            }
        }
    }
}